package com.wmx.genericity;

import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.HashMap;

/**********************************
 * @author wmx
 * @date 2019/11/7 15:57
 * @description:
 * @version 1.0
 ************************************/
@Setter
@Getter
public class Genericity<T> {
    public static void main(String[] args) {
        String zhong1 = new String("zhong");
        String zhong = new String("zhong");
        System.out.println(zhong.equals(zhong1));
        System.out.println(zhong == zhong1);
        ArrayList<String> strings = new ArrayList<>();
        ArrayList<Integer> integers = new ArrayList<>();
        Class<? extends ArrayList> stringsClass = strings.getClass();
        Class<? extends ArrayList> aClass = integers.getClass();
        System.out.println(stringsClass);
        System.out.println(aClass);

        if (stringsClass.equals(aClass)) {
            System.out.println("泛型类型相同");
        }
        /**
         * 输出结果：泛型类型相同。

         通过上面的例子可以证明，在编译之后程序会采取去泛型化的措施。
         也就是说Java中的泛型，只在编译阶段有效。在编译过程中，
         正确检验泛型结果后，会将泛型的相关信息擦出，并且在对象进入
         和离开方法的边界处添加类型检查和类型转换的方法。也就是说，泛型信息不会进入到运行时阶段。

         对此总结成一句话：泛型类型在逻辑上看以看成是多个不同的类型，实际上都是相同的基本类型。
         */
        shwoKeyName(new Genericity<Integer>());
    }

    private T key;

    public static <T extends Integer> T shwoKeyName(Genericity<T> genericity) {
        T key = genericity.getKey();
        return key;
    }

    public static <T> T getInstance(Class<T> tClass) throws IllegalAccessException, InstantiationException {
       return tClass.newInstance();
    }

}

